package com.example.mytips.utils;

import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import org.apache.http.util.TextUtils;

import java.io.File;

public class TextInsertUtil {

    /**
     * 在光标处插入文本
     * @param content 内容
     */
    public static void insertString(AnActionEvent e, String content) {
        if (TextUtils.isEmpty(content)) return;

        ///工程
        Project project = e.getProject();
        if (project == null) return;

        ///上下文
        DataContext context = e.getDataContext();

        //编辑器
        Editor editor = CommonDataKeys.EDITOR.getData(context);
        if (editor == null) return;
        // 文档
        Document document = editor.getDocument();
        // 光标位置
        int offset = editor.getCaretModel().getOffset();

        ///Intellij Platform不允许在主线程中进行实时的文件写入，而需要通过一个异步任务来进行
        WriteCommandAction.runWriteCommandAction(project, new Runnable() {
            @Override
            public void run() {
                // 插入代码
                document.insertString(offset, content);
            }
        });
    }

    /**
     * 将指定路径的模板文件 插入 到光标所在的文件里面
     * @param e
     * @param path 模板目录
     * @param className 类名
     */
    public static void insertString(AnActionEvent e,String path,String className){
        ///工程
        Project project = e.getProject();
        if (project == null) return;

        ///上下文
        DataContext context = e.getDataContext();

        //编辑器
        Editor editor = CommonDataKeys.EDITOR.getData(context);
        if (editor == null) return;
        // 文档
        Document document = editor.getDocument();
        // 光标位置
        int offset = editor.getCaretModel().getOffset();

        // 从txt文件读取模板代码
        StringBuilder templateCode = ReadResourceFileUtil.readFile(path);

        // 替换文本
        String templateFileName = PathUtil.getFileName(path);
        String targetStr = templateCode.toString().replace(templateFileName,className);

        ///Intellij Platform不允许在主线程中进行实时的文件写入，而需要通过一个异步任务来进行
        WriteCommandAction.runWriteCommandAction(project, new Runnable() {
            @Override
            public void run() {
                // 插入代码
                document.insertString(offset, targetStr);
            }
        });
    }
}
